#include <iostream>
#include "circle_queue.hpp"
#include "csemp.h"

// 生产消费者模型-生产者

int main()
{
    struct gril     // 循环队列中的数据元素
    {
        int no;
        char name[50];
    };
    
    // 初始化共享内存
    int shmid = shmget(0x5005, sizeof(CircleQueue<gril, 5>), 0640|IPC_CREAT);
    if (shmid == -1)
    {
        std::cout << "shmget(0x5005) failed" <<std::endl;
        return -1;
    }
    
    // 把共享内存连接到当前进程的地址空间
    CircleQueue<gril, 5> *q = (CircleQueue<gril, 5> *)shmat(shmid, 0, 0);
    if (q == (void *)-1)
    {
        std::cout << "shmat() failed" <<std::endl;
        return -1;
    }
    
    // 初始化循环队列
    q->init();

    // 数据元素
    gril g;

    // 给共享内存加锁。初始化为1
    Csemp mutex;
    mutex.init(0x5001);

    // 信号量的值用于表示队列中元素的个数，初始化为0
    Csemp cond;
    cond.init(0x5002, 0, 0);   

    mutex.wait();  // 加锁

    // 生产元素
    g.no = 3;
    strcpy(g.name, "张三");
    q->push(g);
    g.no = 4;
    strcpy(g.name, "李四");
    q->push(g);
    g.no = 5;
    strcpy(g.name, "王五");
    q->push(g);

    mutex.post();  // 解锁

    cond.post(3);  // 参数3表示生产了3个元素

    // 把共享内存从当前进程中分离
    shmdt(q);
}
